home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.1 (Developer) [x86] / NeXT Step 3.1 Intel dev.cdr.dmg / NextDeveloper / Examples / AppKit / ScrollDoodScroll / TileScrollView.m < prev   
Text File  |  1992-05-28  |  4KB  |  161 lines

  1. // TileScrollView.m
  2. // By Jayson Adams, NeXT Developer Support Team
  3. // Modified for 3.0 by Ali Ozer, May '92
  4. // You may freely copy, distribute and reuse the code in this example.
  5. // NeXT disclaims any warranty of any kind, expressed or implied, as to its
  6. // fitness for any particular use.
  7.  
  8. #import <appkit/ClipView.h>
  9. #import <appkit/Matrix.h>
  10.  
  11. #import "RulerView.h"
  12. #import "PostScriptView.h"
  13.  
  14. #import "TileScrollView.h"
  15.  
  16.  
  17. @implementation TileScrollView
  18.  
  19.  
  20. /* instance methods */
  21.  
  22. - initFrame:(const NXRect *)theFrame
  23. {
  24.     NXRect    rulerViewRect = {{0.0, 0.0}, {NX_WIDTH(theFrame), 20.0}};
  25.     
  26.     [super initFrame:theFrame];
  27.     
  28.   /* create a rulerView */
  29.     rulerView = [[RulerView alloc] initFrame:&rulerViewRect];
  30.     
  31.   /* make a clipView to hold it (we'll adjust its size & position in tile) */
  32.     rulerClipView = [[ClipView alloc] initFrame:&rulerViewRect];
  33.     [self addSubview:rulerClipView];
  34.     [rulerClipView setDocView:rulerView];
  35.  
  36.   /* remember the current scale factor */
  37.     oldScaleFactor = 1.0;
  38.     
  39.     return self;
  40. }
  41.  
  42. - free
  43. {
  44.     [rulerView free];
  45.     [rulerClipView free];
  46.  
  47.     return [super free];
  48. }
  49.  
  50. - changeScale:sender
  51. {
  52.     float scaleFactor = [[sender selectedCell] tag] / 100.0;
  53.     
  54.     if (scaleFactor != oldScaleFactor) {
  55.     [window disableDisplay];
  56.     [[self docView] scale:scaleFactor / oldScaleFactor];
  57.     [rulerView scale:scaleFactor / oldScaleFactor :1.0];
  58.     [self fixUpRuler];
  59.     [window reenableDisplay];
  60.     [self display];
  61.     oldScaleFactor = scaleFactor;
  62.     }
  63.     
  64.     return self;
  65. }
  66.  
  67. - (void)fixUpRuler
  68. {
  69.     NXRect docViewBounds, rulerViewBounds;
  70.     [window disableDisplay];
  71.     [[self docView] getBounds:&docViewBounds];
  72.     [rulerView getBounds:&rulerViewBounds];
  73.     [rulerView sizeTo:NX_WIDTH(&docViewBounds) :NX_HEIGHT(&rulerViewBounds)];
  74.     [self tile];
  75.     [window reenableDisplay];
  76.     [self display];
  77. }
  78.  
  79. - setDocView:aView
  80. {
  81.     id retVal = [super setDocView:aView];
  82.     [self fixUpRuler];
  83.     return retVal;
  84. }
  85.  
  86. - tile
  87. /*
  88.  * tile gets called whenever the scrollView changes size.  Its job is to resize
  89.  * all of the scrollView's "tiled" views (scrollers, contentView and any other
  90.  * views we might want to place in the scrollView's bounds).
  91.  */
  92. {
  93.     NXRect    contentViewRect, rulerRect, rulerClipRect, scrollerRect,
  94.         buttonRect, stubRect;
  95.     
  96.   /* resize and arrange the scrollers and contentView as usual */ 
  97.     [super tile];
  98.     
  99.   /* make sure the popup list and stub view are subviews of us */
  100.     if ([popupListButton superview] != self) {
  101.     [self addSubview:popupListButton];
  102.     }
  103.     if ([stubView superview] != self) {
  104.     [self addSubview:stubView];
  105.     }
  106.     
  107.   /* cut a slice from the contentView to make room for the rulerView */
  108.     [contentView getFrame:&contentViewRect];
  109.     [rulerView getFrame:&rulerRect];
  110.     NXDivideRect(&contentViewRect, &rulerClipRect, NX_HEIGHT(&rulerRect), 1);
  111.     [rulerClipView setFrame:&rulerClipRect];
  112.     [contentView setFrame:&contentViewRect];
  113.     
  114.   /* shrink the vScroller to make room for the stub view */
  115.     [vScroller getFrame:&scrollerRect];
  116.     NXDivideRect(&scrollerRect, &stubRect, NX_HEIGHT(&rulerRect), 1);
  117.     [vScroller setFrame:&scrollerRect];
  118.     [stubView setFrame:&stubRect];
  119.     
  120.   /* now make the hScroller smaller and stick the popupList next to it */
  121.     [hScroller getFrame:&scrollerRect];
  122.     NXDivideRect(&scrollerRect, &buttonRect, 60.0, 2);
  123.     [hScroller setFrame:&scrollerRect];
  124.     NXInsetRect(&buttonRect, 1.0, 1.0);
  125.     [popupListButton setFrame:&buttonRect];
  126.     
  127.     return self;
  128. }
  129.  
  130. - scrollClip:aClipView to:(NXPoint *)aPoint
  131. {
  132.     NXPoint    colOrigin;
  133.     NXRect    colBounds;
  134.     
  135.   /* don't do anything if it's not the contentView */
  136.     if (aClipView != contentView) {
  137.     return self;
  138.     }
  139.     
  140.   /* turn off drawing (to the screen) */
  141.     [window disableFlushWindow];
  142.     
  143.   /* scroll the contentView to the new origin */
  144.     [aClipView rawScroll:aPoint];
  145.     
  146.   /* compute new origin for the rulerView (don't let it scroll vertically) */
  147.     [rulerClipView getBounds:&colBounds];
  148.     colOrigin.x = aPoint->x;
  149.     colOrigin.y = colBounds.origin.y;
  150.     
  151.   /* scroll the ruler view to that point */
  152.     [rulerClipView rawScroll:&colOrigin];
  153.     
  154.   /* send results to screen */
  155.     [[window reenableFlushWindow] flushWindow];
  156.     
  157.     return self;
  158. }
  159.  
  160. @end
  161.